﻿//====================================================================================================================
//Copyright (c) 2011 IdeaBlade
//====================================================================================================================
//Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 
//documentation files (the "Software"), to deal in the Software without restriction, including without limitation 
//the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, 
//and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
//====================================================================================================================
//The above copyright notice and this permission notice shall be included in all copies or substantial portions of 
//the Software.
//====================================================================================================================
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 
//WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS 
//OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
//OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
//====================================================================================================================

using System.ComponentModel.Composition;
using System.Windows;
using Caliburn.Micro;
using HelloWorld.Events;
using IdeaBlade.Application.Framework.Core.Authentication;
using IdeaBlade.EntityModel;

namespace HelloWorld.ViewModel
{
    [Export(typeof(ILoginScreen))]
    public class LoginViewModel : Screen, ILoginScreen
    {
        private readonly IAuthenticationService _authenticationService;
        private readonly IEventAggregator _eventAggregator;

        private bool _isBusy;
        private string _password;

        private string _username;

        [ImportingConstructor]
        public LoginViewModel(IAuthenticationService authenticationService, IEventAggregator eventAggregator)
        {
            _authenticationService = authenticationService;
            _eventAggregator = eventAggregator;
        }

        public string Username
        {
            get { return _username; }
            set
            {
                _username = value;
                NotifyOfPropertyChange(() => Username);
                NotifyOfPropertyChange(() => CanLogin);
            }
        }

        public string Password
        {
            get { return _password; }
            set
            {
                _password = value;
                NotifyOfPropertyChange(() => Password);
                NotifyOfPropertyChange(() => CanLogin);
            }
        }

        public bool IsBusy
        {
            get { return _isBusy; }
            set
            {
                _isBusy = value;
                NotifyOfPropertyChange(() => IsBusy);
            }
        }

        public bool CanLogin
        {
            get { return !string.IsNullOrWhiteSpace(_username) && !string.IsNullOrWhiteSpace(_password); }
        }

        public void Login()
        {
            IsBusy = true;
            _authenticationService
                .LoginAsync(new LoginCredential(_username, _password, null),
                       () =>
                       {
                           _eventAggregator.Publish(new LoginSuccessful(_authenticationService.Principal));
                           IsBusy = false;
                       },
                       e =>
                       {
                           MessageBox.Show(e.Message);
                           IsBusy = false;
                       });
        }
    }
}